#include<iostream>
#include<queue>
using namespace std;

bool exist[403200] = {false};
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0};

struct Map {
    int x, y, arr[3][3], step;
    
    Map() {
        step = 0;
    }

    bool move(int direction) {
        int xx = x + dx[direction];
        int yy = y + dy[direction];
        if (xx>=0 && xx<=2 && yy>=0 && yy<=2) {
            swap(arr[x][y], arr[xx][yy]);
            x = xx;
            y = yy;
            step++;
            return true;
        }
        return false;
    }
}start, target;

queue<Map> qu;

int cantor(int *a, int n)
{
	int ans=0;
	for(int i=0;i<n;i++)
	{
		int count=0, index=1, f=1;
		for(int j=i+1;j<n;j++)
		{
			if(a[j]<a[i])
                count++;
			f *= index;
			index++;
		}
		ans += count * f;
	}
	return ans;
}

int CantorMap(Map map) {
    // 康托展开，将Map对象转换成值
    int temp[9];
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            temp[i*3 + j] = map.arr[i][j];
    return cantor(temp, 9);
}

int main() {
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++) {
            int temp;
            cin >> temp;
            start.arr[i][j] = temp;
            if (temp == 0) {
                start.x = i;
                start.y = j;
            }
        }
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++) {
            int temp;
            cin >> temp;
            target.arr[i][j] = temp;
        }

    int tg = CantorMap(target);
    
    qu.push(start);
    exist[CantorMap(start)] = true;
    
    while(!qu.empty()) {
        for(int i=0; i<4; i++) {
            Map map = qu.front();
            if(map.move(i)) {
                if(exist[CantorMap(map)]) continue;
                if(tg == CantorMap(map)) {
                    cout << map.step + 1;
                    return 0;
                }                    
                qu.push(map);
                exist[CantorMap(map)] = true;
            }
        }
        qu.pop();
    }
    return 0;
}